home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / LANG / C / LIB / UNIXLIB37B / !UnixLib37 / src / stdio / c / fopen < prev    next >
Text File  |  1996-11-09  |  3KB  |  167 lines

  1. /****************************************************************************
  2.  *
  3.  * $Source: /unixb/home/unixlib/source/unixlib37/src/stdio/c/RCS/fopen,v $
  4.  * $Date: 1996/11/06 22:01:42 $
  5.  * $Revision: 1.3 $
  6.  * $State: Rel $
  7.  * $Author: unixlib $
  8.  *
  9.  * $Log: fopen,v $
  10.  * Revision 1.3  1996/11/06 22:01:42  unixlib
  11.  * Yet more changes by NB, PB and SC.
  12.  *
  13.  * Revision 1.2  1996/05/06 09:01:34  unixlib
  14.  * Updates to sources made by Nick Burrett, Peter Burwood and Simon Callan.
  15.  * Saved for 3.7a release.
  16.  *
  17.  * Revision 1.1  1996/04/19 21:32:42  simon
  18.  * Initial revision
  19.  *
  20.  ***************************************************************************/
  21.  
  22. static const char rcs_id[] = "$Id: fopen,v 1.3 1996/11/06 22:01:42 unixlib Rel $";
  23.  
  24. #include <errno.h>
  25. #include <stdlib.h>
  26. #include <stdio.h>
  27. #include <unistd.h>
  28. #include <fcntl.h>
  29.  
  30. #define OPERM 0666        /* open() permission */
  31.  
  32. #ifndef O_OMASK
  33. #define O_OMASK (O_RDONLY|O_WRONLY|O_RDWR)
  34. #endif
  35.  
  36. __STDIOLIB__
  37.  
  38. static FILE *__fopen (const char *, const char *, FILE *);
  39. static FILE *__fdopen (int, int, FILE *);
  40.  
  41. FILE *
  42. fopen (register const char *file, register const char *mode)
  43. {
  44.   register FILE *f;
  45.   register int i;
  46.  
  47.   for (i = 0, f = __iob; i < FOPEN_MAX; i++, f++)
  48.     if (!fisopen (f))
  49.       return (__fopen (file, mode, f));
  50.   return (0);
  51. }
  52.  
  53. FILE *
  54. freopen (register const char *file, register const char *mode,
  55.      register FILE * f)
  56. {
  57.   if (fisopen (f))
  58.     if (fclose (f))
  59.       return (0);
  60.   return (__fopen (file, mode, f));
  61. }
  62.  
  63. FILE *
  64. fdopen (register int fd, register const char *mode)
  65. {
  66.   register FILE *f;
  67.   register int flag, i;
  68.  
  69.   for (i = 0, f = __iob; i < FOPEN_MAX; i++, f++)
  70.     if (!fisopen (f))
  71.       goto open;
  72.   return (0);
  73.  
  74. open:i = *mode;
  75.  
  76.   if (i == 'r')
  77.     flag = _IOREAD;
  78.   else if (i == 'w')
  79.     flag = _IOWRITE;
  80.   else if (i == 'a')
  81.     flag = _IOWRITE | _IOAPPEND;
  82.   else
  83.     return (0);
  84.  
  85.   if (i = *++mode)
  86.     while (i)
  87.       {
  88.     if (i == '+')
  89.       flag |= _IOREAD | _IOWRITE;
  90.     i = *++mode;
  91.       }
  92.  
  93.   return (__fdopen (fd, flag, f));
  94. }
  95.  
  96. static FILE *
  97. __fopen (register const char *file, register const char *mode,
  98.      register FILE * f)
  99. {
  100.   register int flag, oflag, i;
  101.  
  102.   i = *mode;
  103.  
  104.   if (i == 'r')
  105.     {
  106.       flag = _IOREAD;
  107.       oflag = O_RDONLY;
  108.     }
  109.   else if (i == 'w')
  110.     {
  111.       flag = _IOWRITE;
  112.       oflag = O_WRONLY | O_CREAT | O_TRUNC;
  113.     }
  114.   else if (i == 'a')
  115.     {
  116.       flag = _IOWRITE | _IOAPPEND;
  117.       oflag = O_WRONLY | O_CREAT;
  118.     }
  119.   else
  120.     return (0);
  121.  
  122.   if (i = *++mode)
  123.     while (i)
  124.       {
  125.     if (i == 'b')
  126.       oflag |= O_BINARY;
  127.     else if (i == '+')
  128.       {
  129.         flag |= _IOREAD | _IOWRITE;
  130.         oflag = (oflag & (~(O_OMASK | O_TRUNC))) | O_RDWR;
  131.       }
  132.     i = *++mode;
  133.       }
  134.  
  135.   if ((i = open ((char *) file, oflag, OPERM)) < 0)
  136.     return (0);
  137.  
  138.   return (__fdopen (i, flag, f));
  139. }
  140.  
  141. static FILE *
  142. __fdopen (register int fd, register int flag, register FILE * f)
  143. {
  144.   /* Set the magic word for this FILE struct.  */
  145.   f->__magic = _IOMAGIC;
  146.   f->i_ptr = f->i_base = 0;
  147.   f->o_ptr = f->o_base = 0;
  148.   f->i_cnt = f->o_cnt = 0;
  149.   if (isatty (f->fd = fd))
  150.     {
  151.       f->pos = 0;
  152.       flag |= _IOTTY;
  153.       f->flag = (flag & _IOBF) ? flag : (flag | _IOLBF);
  154.     }
  155.   else
  156.     {
  157.       if (flag & _IOAPPEND)
  158.     f->pos = (fpos_t) lseek (fd, 0L, 2);
  159.       else
  160.     f->pos = (fpos_t) lseek (fd, 0L, 0);
  161.       f->flag = (flag & _IOBF) ? flag : (flag | _IOFBF);
  162.     }
  163.   f->bufsiz = BUFSIZ;
  164.  
  165.   return (f);
  166. }
  167.